package com.mazaiting.manager.convert;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mazaiting.common.core.domain.result.Option;
import com.mazaiting.manager.domain.entity.SysRole;
import com.mazaiting.manager.domain.form.RoleForm;
import com.mazaiting.manager.domain.vo.role.RolePageVO;
import com.mazaiting.manager.domain.vo.role.SysRoleDetailVO;
import org.mapstruct.*;

import java.util.List;

/**
 * 角色对象转换器
 *
 * @author mazaiting
 * @create_time 2022/9/20 22:58
 */
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface IRoleConverter {

    /**
     * 角色实体转换为选项卡
     * @param sysRole 角色实体
     * @return 选项卡
     */
    @Mappings({
            @Mapping(target = "value", source = "id"),
            @Mapping(target = "label", source = "name")
    })
    Option<Long> role2Option(SysRole sysRole);

    /**
     * 角色实体列表转换为选项卡列表
     * @param roleList 角色实体列表
     * @return 选项卡列表
     */
    List<Option<Long>> roles2Options(List<SysRole> roleList);

    /**
     * 分页实体数据转换为视图数据
     * @param sysRolePage 角色分页数据
     * @return 视图数据
     */
    Page<RolePageVO> entity2Page(Page<SysRole> sysRolePage);

    /**
     * 数据库实体转换为详情 VO
     * @param sysRole 系统角色
     * @return 详情信息
     */
    SysRoleDetailVO entity2VO(SysRole sysRole);

    /**
     * 将角色表单数据转换为系统角色实体
     * @param roleForm 角色表单数据
     * @return 系统角色实体
     */
    SysRole form2Entity(RoleForm roleForm);

    /**
     * 将表单数据注入到系统实体
     * @param roleForm 角色表单
     * @param sysRole 系统实体
     */
    void form2Entity(RoleForm roleForm, @MappingTarget SysRole sysRole);
}
